﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using estudent.Models;

namespace estudent.Controllers
{
    public class KartotecniListReferController : Controller
    {

        estudentEnt db = null;
        IEnumerable<Vpisi> vpisiStudenta = null;
        string vpisna = "";

        public KartotecniListReferController()
        {
            db = new estudentEnt();

        }


        //
        // GET: /KartotecniListRefer/

        public ActionResult Index()
        {
            ViewData["namen"] = "KartotecniListRefer";
            return View("IskanjeStudent");
        }

        public ActionResult Seznam(string id)
        {
            //pogledamo, ali ima nas student razlicne smeri glede vpisov
            vpisna = id;
            IEnumerable<Vpisi> vpisi = db.Vpisis.Where(v => v.username == vpisna);//dobimo vpise
            IEnumerable<SSmeri> smeri = from s in db.SSmeris
                                        join v in vpisi on s.sSmer equals v.sSmer
                                        select s;

            smeri = smeri.Distinct();
            if (smeri.Count() > 1)
                ViewData["smeri"] = smeri;

            ViewData["vpisna"] = id;//to moramo parsat, da bo prikazi metoda vedela, za koga v hidden fieldu

            return View("SeznamOcen");
        }


        [AcceptVerbs(HttpVerbs.Post)]
        public string Prikazi(FormCollection form)
        {
            vpisna = form["vpisna"];
            if (form["smer"] != null)
            {
                string studProgSmer = form["smer"];
                if (studProgSmer.CompareTo("neglede") == 0)
                    vpisiStudenta = db.Vpisis.Where(v => v.username == vpisna).OrderBy(v => v.letoVpisa);
                else
                    vpisiStudenta = db.Vpisis.Where(v => v.username == vpisna && v.sSmer == studProgSmer).OrderBy(v => v.letoVpisa);
            }
            else
                vpisiStudenta = db.Vpisis.Where(v => v.username == vpisna).OrderBy(v => v.letoVpisa);

            Studenti student = db.Studentis.FirstOrDefault(s => s.username == vpisna);

            //gremo lepo po njegovih vpisi
            string result = "<p><b>Pregled ocen - " + vpisna + " " + student.ime + " " + student.priimek + "</b></p>";
            foreach (var vpis in vpisiStudenta)
            {
                result += "<table bgcolor='#F2F2F2' border='0' cellpadding='2' cellspacing='2'>";
                result += "<tr>";
                result += "<td><b>Študijsko leto:</b> " + vpis.letoVpisa.Year + "/" + (vpis.letoVpisa.Year + 1) + "&nbsp;</td>";
                result += "<td><b>Smer:</b> " + vpis.SSmeri.sSmer + " -> " + vpis.SSmeri.imeSmer + "</td>";
                result += "</tr>";
                result += "<tr>";
                result += "<td><b>Letnik:</b> " + vpis.LetnikiStudija.opisLetnika + "</td>";
                result += "<td><b>Vrsta vpisa:</b> " + vpis.VrsteVpisa.opisVrste + "</td>";
                result += "</tr>";
                result += "<tr>";
                result += "<td><b>Način:</b> " + ((vpis.redni == true) ? "redni" : "izredni") + "</td>";
                result += "<td><b>Skupina:</b> " + vpis.skupina + "</td>";
                result += "</tr>";
                result += "</table>";
                result += "<br/>";

                result += "<table border='1' cellpadding='0' cellspacing='0'>";
                result += "<tr align='center'>";
                result += "<th>Zap. št.</th>";
                result += "<th>Predmet</th>";
                result += "<th>KT</th>";
                result += "<th>Profesor</th>";
                result += "<th>Datum</th>";
                result += "<th>Ocena</th>";
                result += "<th colspan='2'>Št. polaganj</th>";
                result += "<th>Opravljen</th>";
                result += "</tr>";
                //IEnumerable<ObvezenPredmet> obvezniPredmId = db.ObvezenPredmets.Where(o => o.sSmer == vpis.sSmer && o.idLetnikStudija == vpis.LetnikiStudija.idLetnikStudija);
                IEnumerable<sPredmeti> obvezni = vpis.sPredmetis; //from p in db.sPredmetis
                                                 //from p2 in obvezniPredmId
                                                // where p.sPredmeta == p2.sPredmeta
                                                // select p;

                IEnumerable<PrijaveNaIzpit> prijave = vpis.PrijaveNaIzpits;

                //k obveznim bomo uturili se strokovne,izbrine al pa modulske predmete
                //IEnumerable<sPredmeti> drugiPred = vpis.sPredmetis;
                //obvezni = obvezni.Union(drugiPred);

                double povpIzp = 0.0;
                double povpVaj = 0.0;
                double povpOcen = 0.0;
                int stTock = 0;
                int delitelj = 0;
                int deliPovpOcen = 0;
                int dosezeneTock = 0;

                int i = 1;
                foreach (var pred in obvezni)
                {
                    result += "<tr align='center'>";
                    result += "<td>" + (i++) + ".</td>";
                    result += "<td>" + pred.imePredmeta + "</td>";
                    result += "<td>" + pred.stKreditnih + "</td>";

                    stTock += (int)pred.stKreditnih;

                    IEnumerable<PrijaveNaIzpit> prijaveNaPredmet = (prijave.Where(p => p.IzpitniRoki.Poucuje.sPredmeta == pred.sPredmeta && ((p.koncnaOcena != null && p.koncnaOcena != -1)||(p.koncnaOcenaVaj!=null)))).OrderBy(p => p.datumRoka);

                    string partialResult = "";

                    if (prijaveNaPredmet.Count() > 0)
                    {
                        int stPolaganj = 0;
                        int stPolaganjVTrenutnemLetu = 0;
                        DateTime prejsnji = new DateTime(10, 1, 1);
                        foreach (var p in prijaveNaPredmet)
                        {
                            if (prejsnji != null && !vDatumu(prejsnji, p.datumRoka))
                            {
                                stPolaganjVTrenutnemLetu = 0;
                            }
                            if (stPolaganj <= 0)
                            {
                                if (form["polaganje"].CompareTo("vsa") == 0)
                                {
                                    //profesorje dobit iz prijave in potem posredno iz izpitnega roka, ce je kombinacija
                                    result += "<td>";
                                    IzpitniRoki rok = p.IzpitniRoki;//dobimo rok iz prijave
                                    if (rok != null)
                                        result += rok.Poucuje.SProfesorji1.priimekProfesor + " " + rok.Poucuje.SProfesorji1.imeProfesor;
                                    if (rok.Poucuje.SProfesorji2 != null)
                                    {
                                        SProfesorji prof2 = db.SProfesorjis.FirstOrDefault(pr => pr.sProfesor == rok.Poucuje.SProfesorji2.sProfesor);
                                        result += ", " + prof2.priimekProfesor + " " + prof2.imeProfesor;
                                    }
                                    if (rok.Poucuje.SProfesorji != null)
                                    {
                                        SProfesorji prof3 = db.SProfesorjis.FirstOrDefault(pr => pr.sProfesor == rok.Poucuje.SProfesorji.sProfesor);
                                        result += ", " + prof3.priimekProfesor + " " + prof3.imeProfesor;
                                    }
                                    result += "</td>";
                                    /////////////////////////////////////////////////////////////////////////////////////


                                    result += "<td>" + String.Format("{0:dd/MM/yyyy HH:mm}", p.datumRoka) + "</td>";
                                    result += "<td>" + p.koncnaOcena + "" + ((p.koncnaOcenaVaj != null) ? "/" + p.koncnaOcenaVaj : "") + "</td>";
                                    result += "<td>" + (stPolaganj + 1) + "</td>";
                                    result += "<td>" + (stPolaganjVTrenutnemLetu + 1) + "</td>";
                                    result += "<td>" + ((p.koncnaOcena == null || p.koncnaOcena < 6 || p.koncnaOcenaVaj < 6) ? "NE" : "DA") + "</td>";


                                    povpVaj += (p.koncnaOcenaVaj == null || p.koncnaOcenaVaj < 6) ? 0.0 : (double)p.koncnaOcenaVaj;
                                    povpIzp += (p.koncnaOcena == null || p.koncnaOcena < 6) ? 0.0 : (double)p.koncnaOcena;
                                    povpOcen += (p.koncnaOcena == null || p.koncnaOcena < 6 || p.koncnaOcenaVaj < 6) ? 0.0 : ((double)p.koncnaOcena + ((p.koncnaOcenaVaj == null) ? 0.0 : (double)p.koncnaOcenaVaj));
                                    deliPovpOcen += (p.koncnaOcena == null || p.koncnaOcena < 6) ? 0 : 1;
                                    deliPovpOcen += (p.koncnaOcenaVaj == null || p.koncnaOcenaVaj < 6) ? 0 : 1;
                                    delitelj += (p.koncnaOcena == null || p.koncnaOcena< 6 || p.koncnaOcenaVaj < 6) ? 0 : 1;

                                    dosezeneTock += (p.koncnaOcena == null || p.koncnaOcena < 6 || p.koncnaOcenaVaj < 6) ? 0 : (int)pred.stKreditnih;
                                }
                                else
                                {
                                    //profesorje dobit iz prijave in potem posredno iz izpitnega roka, ce je kombinacija
                                    partialResult = "<td>";
                                    IzpitniRoki rok = p.IzpitniRoki;//dobimo rok iz prijave
                                    if (rok != null)
                                        partialResult += rok.Poucuje.SProfesorji1.priimekProfesor + " " + rok.Poucuje.SProfesorji1.imeProfesor;
                                    if (rok.Poucuje.SProfesorji2 != null)
                                    {
                                        SProfesorji prof2 = db.SProfesorjis.FirstOrDefault(pr => pr.sProfesor == rok.Poucuje.SProfesorji2.sProfesor);
                                        partialResult += ", " + prof2.priimekProfesor + " " + prof2.imeProfesor;
                                    }
                                    if (rok.Poucuje.SProfesorji != null)
                                    {
                                        SProfesorji prof3 = db.SProfesorjis.FirstOrDefault(pr => pr.sProfesor == rok.Poucuje.SProfesorji.sProfesor);
                                        partialResult += ", " + prof3.priimekProfesor + " " + prof3.imeProfesor;
                                    }
                                    partialResult += "</td>";
                                    /////////////////////////////////////////////////////////////////////////////////////

                                    partialResult += "<td>" + String.Format("{0:dd/MM/yyyy HH:mm}", p.datumRoka) + "</td>";
                                    partialResult += "<td>" + p.koncnaOcena + ((p.koncnaOcenaVaj != null) ? "/" + p.koncnaOcenaVaj : "") + "</td>";
                                    partialResult += "<td>" + (stPolaganj + 1) + "</td>";
                                    partialResult += "<td>" + (stPolaganjVTrenutnemLetu + 1) + "</td>";
                                    partialResult += "<td>" + ((p.koncnaOcena == null || p.koncnaOcena < 6 || p.koncnaOcenaVaj < 6) ? "NE" : "DA") + "</td>";

                                    povpVaj += (p.koncnaOcenaVaj == null || p.koncnaOcenaVaj < 6) ? 0.0 : (double)p.koncnaOcenaVaj;
                                    povpIzp += (p.koncnaOcena == null || p.koncnaOcena < 6) ? 0.0 : (double)p.koncnaOcena;
                                    povpOcen += (p.koncnaOcena == null || p.koncnaOcena < 6 || p.koncnaOcenaVaj < 6) ? 0.0 : ((double)p.koncnaOcena + ((p.koncnaOcenaVaj == null) ? 0.0 : (double)p.koncnaOcenaVaj));
                                    deliPovpOcen += (p.koncnaOcena == null || p.koncnaOcena < 6) ? 0 : 1;
                                    deliPovpOcen += (p.koncnaOcenaVaj == null || p.koncnaOcenaVaj < 6) ? 0 : 1;
                                    delitelj += (p.koncnaOcena == null || p.koncnaOcena < 6 || p.koncnaOcenaVaj < 6) ? 0 : 1;

                                    dosezeneTock += (p.koncnaOcena == null || p.koncnaOcena < 6 || p.koncnaOcenaVaj < 6) ? 0 : (int)pred.stKreditnih;
                                }
                            }
                            else
                            {
                                if (form["polaganje"].CompareTo("vsa") == 0)
                                {
                                    result += "<tr align='center'>";
                                    result += "<td>" + (i++) + ".</td>";
                                    result += "<td>&nbsp;</td>";
                                    result += "<td>&nbsp;</td>";

                                    //profesorje dobit iz prijave in potem posredno iz izpitnega roka, ce je kombinacija
                                    result += "<td>";
                                    IzpitniRoki rok = p.IzpitniRoki;//dobimo rok iz prijave
                                    if (rok != null)
                                        result += rok.Poucuje.SProfesorji1.priimekProfesor + " " + rok.Poucuje.SProfesorji1.imeProfesor;
                                    if (rok.Poucuje.SProfesorji2 != null)
                                    {
                                        SProfesorji prof2 = db.SProfesorjis.FirstOrDefault(pr => pr.sProfesor == rok.Poucuje.SProfesorji2.sProfesor);
                                        result += ", " + prof2.priimekProfesor + " " + prof2.imeProfesor;
                                    }
                                    if (rok.Poucuje.SProfesorji != null)
                                    {
                                        SProfesorji prof3 = db.SProfesorjis.FirstOrDefault(pr => pr.sProfesor == rok.Poucuje.SProfesorji.sProfesor);
                                        result += ", " + prof3.priimekProfesor + " " + prof3.imeProfesor;
                                    }
                                    result += "</td>";
                                    /////////////////////////////////////////////////////////////////////////////////////

                                    result += "<td>" + String.Format("{0:dd/MM/yyyy HH:mm}", p.datumRoka) + "</td>";
                                    result += "<td>" + p.koncnaOcena + ((p.koncnaOcenaVaj != null) ? "/" + p.koncnaOcenaVaj : "") + "</td>";
                                    result += "<td>" + (stPolaganj + 1) + "</td>";
                                    result += "<td>" + (stPolaganjVTrenutnemLetu + 1) + "</td>";
                                    result += "<td>" + ((p.koncnaOcena == null || p.koncnaOcena < 6 || p.koncnaOcenaVaj < 6) ? "NE" : "DA") + "</td>";

                                    povpVaj += (p.koncnaOcenaVaj == null || p.koncnaOcenaVaj < 6) ? 0.0 : (double)p.koncnaOcenaVaj;
                                    povpIzp += (p.koncnaOcena == null || p.koncnaOcena < 6) ? 0.0 : (double)p.koncnaOcena;
                                    povpOcen += (p.koncnaOcena == null || p.koncnaOcena < 6 || p.koncnaOcenaVaj < 6) ? 0.0 : ((double)p.koncnaOcena + ((p.koncnaOcenaVaj == null) ? 0.0 : (double)p.koncnaOcenaVaj));
                                    deliPovpOcen += (p.koncnaOcena == null || p.koncnaOcena < 6) ? 0 : 1;
                                    deliPovpOcen += (p.koncnaOcenaVaj == null || p.koncnaOcenaVaj < 6) ? 0 : 1;
                                    delitelj += (p.koncnaOcena == null || p.koncnaOcena < 6 || p.koncnaOcenaVaj < 6) ? 0 : 1;

                                    dosezeneTock += (p.koncnaOcena == null || p.koncnaOcena < 6 || p.koncnaOcenaVaj < 6) ? 0 : (int)pred.stKreditnih;
                                }
                                else
                                {
                                    //profesorje dobit iz prijave in potem posredno iz izpitnega roka, ce je kombinacija
                                    partialResult = "<td>";
                                    IzpitniRoki rok = p.IzpitniRoki;//dobimo rok iz prijave
                                    if (rok != null)
                                        partialResult += rok.Poucuje.SProfesorji1.priimekProfesor + " " + rok.Poucuje.SProfesorji1.imeProfesor;
                                    if (rok.Poucuje.SProfesorji2 != null)
                                    {
                                        SProfesorji prof2 = db.SProfesorjis.FirstOrDefault(pr => pr.sProfesor == rok.Poucuje.SProfesorji2.sProfesor);
                                        partialResult += ", " + prof2.priimekProfesor + " " + prof2.imeProfesor;
                                    }
                                    if (rok.Poucuje.SProfesorji != null)
                                    {
                                        SProfesorji prof3 = db.SProfesorjis.FirstOrDefault(pr => pr.sProfesor == rok.Poucuje.SProfesorji.sProfesor);
                                        partialResult += ", " + prof3.priimekProfesor + " " + prof3.imeProfesor;
                                    }
                                    partialResult += "</td>";
                                    /////////////////////////////////////////////////////////////////////////////////////

                                    partialResult += "<td>" + String.Format("{0:dd/MM/yyyy HH:mm}", p.datumRoka) + "</td>";
                                    partialResult += "<td>" + p.koncnaOcena + ((p.koncnaOcenaVaj != null) ? "/" + p.koncnaOcenaVaj : "") + "</td>";
                                    partialResult += "<td>" + (stPolaganj + 1) + "</td>";
                                    partialResult += "<td>" + (stPolaganjVTrenutnemLetu + 1) + "</td>";
                                    partialResult += "<td>" + ((p.koncnaOcena == null || p.koncnaOcena < 6 || p.koncnaOcenaVaj < 6) ? "NE" : "DA") + "</td>";
                                    
                                    povpVaj += (p.koncnaOcenaVaj == null || p.koncnaOcenaVaj < 6) ? 0.0 : (double)p.koncnaOcenaVaj;
                                    povpIzp += (p.koncnaOcena == null || p.koncnaOcena < 6) ? 0.0 : (double)p.koncnaOcena;
                                    povpOcen += (p.koncnaOcena == null || p.koncnaOcena < 6 || p.koncnaOcenaVaj < 6) ? 0.0 : ((double)p.koncnaOcena + ((p.koncnaOcenaVaj == null) ? 0.0 : (double)p.koncnaOcenaVaj));
                                    deliPovpOcen += (p.koncnaOcena == null || p.koncnaOcena < 6) ? 0 : 1;
                                    deliPovpOcen += (p.koncnaOcenaVaj == null || p.koncnaOcenaVaj < 6) ? 0 : 1;
                                    delitelj += (p.koncnaOcena == null || p.koncnaOcena < 6 || p.koncnaOcenaVaj < 6) ? 0 : 1;

                                    dosezeneTock += (p.koncnaOcena == null || p.koncnaOcena < 6 || p.koncnaOcenaVaj < 6) ? 0 : (int)pred.stKreditnih;

                                }
                            }

                            stPolaganj++;
                            stPolaganjVTrenutnemLetu++;
                            prejsnji = p.datumRoka;
                        }

                        if (form["polaganje"].CompareTo("zadnje") == 0)
                        {
                            result += partialResult;
                        }

                    }
                    else
                    {
                        result += "<td>&nbsp;</td>";
                        result += "<td>&nbsp;</td>";
                        result += "<td>&nbsp;</td>";
                        result += "<td>&nbsp;</td>";
                        result += "<td>&nbsp;</td>";
                        result += "<td>NE</td>";
                    }

                    result += "</tr>";
                }
                result += "</table>";

                //se povprecje ocen
                result += "<table bgcolor='#f1f1f1'>";
                result += "<tr>";
                result += "<td style='width:200px'>";
                result += "<b>Povprečje izpitov:</b> " + povpIzp / delitelj;
                result += "</td>";
                result += "<td  style='width:200px'>";
                result += "<b>Povprečje vaj:</b> " + povpVaj / delitelj;
                result += "</td>";
                result += "<td  style='width:200px'>";
                result += "<b>Povprečna ocena:</b> " + povpOcen / deliPovpOcen;
                result += "</td>";
                result += "</tr>";
                result += "<tr>";
                result += "<td colspan='3'  style='width:600px'>";
                result += "<b>Skupno število kreditnih točk/ur:</b> " + dosezeneTock + " od " + stTock;
                result += "</td>";
                result += "</tr>";
                result += "</table></br></br>";

            }

            return result;
        }

        [NonAction]
        private bool vDatumu(DateTime poznan, DateTime nov)
        {
            //ustvart interval na podlagi poznanega datuma
            int p = poznan.Year * 365 + poznan.Month * 31 + poznan.Day;
            int n = nov.Year * 365 + nov.Month * 31 + nov.Day;

            DateTime t1 = new DateTime(poznan.Year, 10, 1);
            DateTime t2 = new DateTime(poznan.Year, 12, 31);

            if (poznan >= t1 && poznan <= t2)
            {
                //prva polovica
                DateTime p1 = new DateTime(poznan.Year, 10, 1);
                DateTime p2 = new DateTime(poznan.Year + 1, 9, 30);
                if (nov >= p1 && nov <= p2)
                    return true;
            }
            else
            {
                //druga polovica
                DateTime p1 = new DateTime(poznan.Year - 1, 10, 1);
                DateTime p2 = new DateTime(poznan.Year, 9, 30);
                if (nov >= p1 && nov <= p2)
                    return true;
            }

            return false;
        }

    }
}
